package com.zmh.service.msg;

import java.io.File;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import com.zmh.common.DateUtil;
import com.zmh.dao.MailMapper;
import com.zmh.entity.MailEntity;

/** 
 * @author zhoumh
 * @version 创建时间：2018年7月16日 下午9:14:48 
 * @Description 
*/
@Service
public class MailService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender mailSender;
    @Autowired
    private MailMapper mailMapper;
    
    private static String from = "zhoumh1985@qq.com";
    private static String to = "zmh1812@qq.com";
    
    /**
     * 邮件接收
     * @return: void
     * @author: zhoumh
     * @version: 创建时间：2018年8月31日 下午3:50:07 
     * @throws Exception 
     * @Description:
     */
    public void receiveMail() throws Exception{
        //收件人地址
        String recipientAddress = "xxx@163.com";
        //收件人账户名
        String recipientAccount = "xxx";
        //收件人账户密码
        String recipientPassword = "xxx";
         
        //1、连接邮件服务器的参数配置
        Properties props = new Properties();
        //设置传输协议
        props.setProperty("mail.store.protocol", "pop3");
        //设置收件人的POP3服务器
        props.setProperty("mail.pop3.host", "pop3.163.com");
        //2、创建定义整个应用程序所需的环境信息的 Session 对象
        Session session = Session.getInstance(props);
        //设置调试信息在控制台打印出来
        //session.setDebug(true);
         
        Store store = session.getStore("pop3");
        //连接收件人POP3服务器
        store.connect("pop3.163.com", recipientAccount, recipientPassword);
        //获得用户的邮件账户，注意通过pop3协议获取某个邮件夹的名称只能为inbox
        Folder folder = store.getFolder("inbox");
        //设置对邮件账户的访问权限
        folder.open(Folder.READ_WRITE);
         
        //得到邮件账户的所有邮件信息
        Message [] messages = folder.getMessages();
        for(int i = 0 ; i < messages.length ; i++){
            //获得邮件主题
            String subject = messages[i].getSubject();
            //获得邮件发件人
            Address[] from = messages[i].getFrom();
            //获取邮件内容（包含邮件内容的html代码）
            String content = (String) messages[i].getContent();
        }
         
        //关闭邮件夹对象
        folder.close();
        //关闭连接对象
        store.close();
    }
    /**
     * 邮件发送
     * @return: void
     * @author: zhoumh
     * @version: 创建时间：2018年8月31日 下午3:49:53 
     * @Description:
     */
    public void sendMail(){
    	MailEntity mailEntity = mailMapper.getOneByState();
    	if (mailEntity == null) {
			return;
		}
    	switch (mailEntity.getType()) {
			case "sendSimpleMail" :
				sendSimpleMail(mailEntity);
				break;
			case "sendHtmlMail" :
				sendHtmlMail(mailEntity);
				break;
			case "sendAttachmentsMail" :
				sendAttachmentsMail(mailEntity);
				break;
			case "sendInlineResourceMail" :
//				sendInlineResourceMail(mailEntity);
				break;
			default :
				return;
		}
    	yfMail(DateUtil.getDateTime(),mailEntity.getUuid());
    	
    }
    /**
     * 保存邮件
     * @return: int
     * @author: zhoumh
     * @version: 创建时间：2018年8月17日 上午11:03:13 
     * @Description:
     */
    public int saveMail(MailEntity mailEntity){
    	return mailMapper.insert(mailEntity);
    }
    /**
     * 修改邮件状态为已发送
     * @return: int
     * @author: zhoumh
     * @version: 创建时间：2018年8月17日 上午11:04:25 
     * @Description:
     */
    public int yfMail(String updateTime, String uuid){
    	return mailMapper.yfMail(updateTime, uuid);
    }
	/**
	 * 简单邮件发送
	 * @param MailEntity 邮件实体
	 * @return: void
	 * @author: zhoumh
	 * @version: 创建时间：2018年7月16日 下午9:17:04 
	 * @Description:
	 */
    public void sendSimpleMail(MailEntity mailEntity) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(mailEntity.getFrom());
        message.setTo(mailEntity.getTo());
        message.setSubject(mailEntity.getSubject());
        message.setText(mailEntity.getContent());

        try {
            mailSender.send(message);
            logger.info("简单邮件已经发送。");
        } catch (Exception e) {
            logger.error("发送简单邮件时发生异常！", e);
        }

    }
    /**
     * html格式邮件发送
     * @param to
     * @param subject
     * @param content 
     * @return: void
     * @author: zhoumh
     * @version: 创建时间：2018年7月16日 下午9:17:31 
     * @Description:
     */
    public void sendHtmlMail(MailEntity mailEntity) {
        MimeMessage message = mailSender.createMimeMessage();

        try {
            //true表示需要创建一个multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(mailEntity.getFrom());
            helper.setTo(mailEntity.getTo());
            helper.setSubject(mailEntity.getSubject());
            helper.setText(mailEntity.getContent(), true);

            mailSender.send(message);
            logger.info("html邮件发送成功");
        } catch (MessagingException e) {
            logger.error("发送html邮件时发生异常！", e);
        }
    }
    /**
     * 带附件邮件发送
     * @param to
     * @param subject
     * @param content
     * @param filePath 
     * @return: void
     * @author: zhoumh
     * @version: 创建时间：2018年7月16日 下午9:18:04 
     * @Description:
     */
    public void sendAttachmentsMail(MailEntity mailEntity){
        MimeMessage message = mailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(mailEntity.getFrom());
            helper.setTo(mailEntity.getTo());
            helper.setSubject(mailEntity.getSubject());
            helper.setText(mailEntity.getContent(), true);

            FileSystemResource file = new FileSystemResource(new File(mailEntity.getFilePath()));
            String fileName = mailEntity.getFilePath().substring(mailEntity.getFilePath().lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);

            mailSender.send(message);
            logger.info("带附件的邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送带附件的邮件时发生异常！", e);
        }
    }
    /**
     * 带图片邮件发送
     * @param to
     * @param subject
     * @param content
     * @param rscPath
     * @param rscId 
     * @return: void
     * @author: zhoumh
     * @version: 创建时间：2018年7月16日 下午9:18:28 
     * @Description:
     */
    public void sendInlineResourceMail(MailEntity mailEntity,String to, String subject, String content, String rscPath, String rscId){
        MimeMessage message = mailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(mailEntity.getFrom());
            helper.setTo(mailEntity.getTo());
            helper.setSubject(mailEntity.getSubject());
            helper.setText(mailEntity.getContent(), true);

            FileSystemResource res = new FileSystemResource(new File(mailEntity.getFilePath()));
            helper.addInline(rscId, res);

            mailSender.send(message);
            logger.info("嵌入静态资源的邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送嵌入静态资源的邮件时发生异常！", e);
        }
    }
    
}
